/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package myftp.core.controller;

import java.util.HashMap;
import myftp.core.action.AbstractAction;
import myftp.core.model.AbstractModel;
import myftp.core.view.AbstractView;

/**
 *
 * @author CAVARLE Glenn, LUCAS Stéphane
 *
 * Classe de contrôle des actions
 * Exécute les actions
 */
public class ActionController {

    /**
     * Nom de l'action à exécuter
     * @var actionName
     */
    private String actionName;
    /**
     * vue associée au controller
     * @var view
     */
    private AbstractView view;
    /**
     * modèle associé au controller
     * @var model
     */
    private AbstractModel model;
    /**
     * parametres de l'action à exécuter
     */
    private HashMap<String, Object> actionParams = new HashMap();

    /**
     * setter du nom de l'action
     * @param actionName
     */
    public void setActionName(String actionName) {
        this.actionName = actionName;
    }

    /**
     * getter du nom de l'action
     * @return String
     */
    public String getActionName() {
        return this.actionName;
    }

    /**
     * Exécution de l'action
     * (lancement du thread)
     * @throws ClassNotFoundException
     * @throws InstantiationException
     * @throws IllegalAccessException
     */
    public void run() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        AbstractAction action = (AbstractAction) Class.forName("myftp.app.action." + this.getActionName()).newInstance();

        action.setParams(this.getActionParams());
        if (action.configure(this, this.getModel())) {
            new Thread(action).start();
        }
    }

    /**
     * setter pour la vue
     * @param view
     */
    public void setView(AbstractView view) {
        this.view = view;
    }

    /**
     * getter pour la vue
     * @return AbstractView
     */
    public AbstractView getView() {
        return this.view;
    }

    /**
     * setter pour le modèle
     * @param model
     */
    public void setModel(AbstractModel model) {
        this.model = model;
    }

    /**
     * getter pour le modèle
     * @return AbstractModel
     */
    public AbstractModel getModel() {
        return this.model;
    }

    /**
     * setter pour les parametres de l'action
     * @param actionParams
     */
    public void setActionParams(HashMap<String, Object> actionParams) {
        this.actionParams = actionParams;
    }

    /**
     * setter pour un parametre de l'action
     * @param key
     * @param actionParams
     */
    public void setActionParam(String key, Object actionParams) {
        this.actionParams.put(key, actionParams);
    }

    /**
     * getter pour les parametres de l'action
     * @return HashMap
     */
    public HashMap getActionParams() {
        return this.actionParams;
    }

    /**
     * getter pour un parametre de l'action
     * @return Object
     */
    public Object getActionParam(String key) {
        if (!this.actionParams.containsKey(key)) {
            return null;
        }
        return this.actionParams.get(key);
    }
}
